"""
主执行脚本
该脚本是 ChatAD 应用的命令行入口。它负责：
1. 解析命令行参数，如任务描述、项目名称等。
2. 根据参数加载对应的配置文件。
3. 初始化并按顺序执行 ChatChain 中的各个阶段（预处理、人员招募、对话链、后处理）。
4. 设置日志记录。
5. 在任务结束后输出最终的项目路径。
"""
import argparse
import faiss
import logging
import os
import sys
import io # Added for io.TextIOWrapper

# 将 stdout 和 stderr 的默认编码设置为 UTF-8
if sys.platform == "win32":
    try:
        sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
        sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')
    except Exception as e:
        print(f"警告: 设置 stdout/stderr 编码为 UTF-8 失败: {e}")
faiss.logger.setLevel(logging.ERROR)  # 屏蔽 Faiss 的 INFO 日志
import os
from camel.typing import ModelType
# 获取当前脚本所在目录的绝对路径，并将其添加到系统路径中，以便导入项目模块
root = os.path.dirname(__file__)
sys.path.append(root)
from chatad.chat_chain import ChatChain


def get_config(company):
    """
    return 配置文件路径
    用户可以自定义配置文件，其他文件将使用默认配置
    Args:
        company (str): 公司（配置）名称，对应于 CompanyConfig/ 目录下的一个文件夹。

    Returns:
        tuple: 一个包含三个配置文件路径的元组 (ChatChainConfig, PhaseConfig, RoleConfig)。
    """
    config_dir = os.path.join(root, "CompanyConfig", company)
    default_config_dir = os.path.join(root, "CompanyConfig", "Default")

    config_files = [
        "ChatChainConfig.json",
        "PhaseConfig.json",
        "RoleConfig.json"
    ]

    config_paths = []

    for config_file in config_files:
        company_config_path = os.path.join(config_dir, config_file)
        default_config_path = os.path.join(default_config_dir, config_file)

        if os.path.exists(company_config_path):
            config_paths.append(company_config_path)
        else:
            config_paths.append(default_config_path)

    return tuple(config_paths)

# ----------------------------------------
#          1. 解析命令行参数
# ----------------------------------------
# 使用 argparse 库来定义和解析命令行参数，提高脚本的灵活性
parser = argparse.ArgumentParser(description='argparse')
parser.add_argument('--config', type=str, default="Default",
                    help="配置文件的名称，用于加载 CompanyConfig/ 目录下的特定配置。")
parser.add_argument('--org', type=str, default="DefaultOrganization",
                    help="组织机构的名称，生成的项目将位于 WareHouse/name_org_timestamp 目录下。")
parser.add_argument('--task', type=str, default="为某品牌制定一份广告投放方案，包括投放平台选择、预算分配、广告内容建议等。",
                    help="需要AI完成的具体任务描述。")
parser.add_argument('--name', type=str, default="AdCampaign",
                    help="项目的名称，生成的项目将位于 WareHouse/name_org_timestamp 目录下。")
parser.add_argument('--model', type=str, default="DEFAULT_MODEL",
                    help="选择使用的AI模型。")
parser.add_argument('--path', type=str, default="",
                    help="项目的目录路径。")
args = parser.parse_args()

# ----------------------------------------
#          2. 初始化 ChatChain
# ----------------------------------------
# 根据解析的参数，获取配置文件的实际路径
config_path, config_phase_path, config_role_path = get_config(args.config)
# 将命令行中的模型字符串参数映射到程序内部的枚举类型
args2type = {
    'DEFAULT_MODEL': ModelType.DEFAULT_MODEL,
}

# 实例化 ChatChain，这是整个AI协作流程的总控制器
chat_chain = ChatChain(config_path=config_path,
                       config_phase_path=config_phase_path,
                       config_role_path=config_role_path,
                       task_prompt=args.task,
                       project_name=args.name,
                       org_name=args.org,
                       model_type=args2type[args.model])

# ----------------------------------------
#          3. 初始化日志系统
# ----------------------------------------
# 配置日志记录器，将所有INFO及以上级别的日志信息输出到指定的文件中
logging.basicConfig(filename=chat_chain.log_filepath, level=logging.INFO,
                    format='[%(asctime)s %(levelname)s] %(message)s',
                    datefmt='%Y-%d-%m %H:%M:%S', encoding="utf-8")

# ----------------------------------------
#          4. 预处理阶段
# ----------------------------------------
# 执行任务开始前的准备工作，例如创建工作目录等
chat_chain.pre_processing()

# ----------------------------------------
#          5. 人员招募阶段
# ----------------------------------------
# "招聘"并初始化本次任务所需的所有AI智能体角色
chat_chain.make_recruitment()

# ----------------------------------------
#          6. 对话链执行阶段
# ----------------------------------------
# 启动AI智能体之间的多轮对话，这是完成核心任务的主要阶段
chat_chain.execute_chain()

# ----------------------------------------
#          7. 后处理阶段
# ----------------------------------------
# 任务完成后进行收尾工作，例如生成最终报告、清理临时文件等
chat_chain.post_processing()

# ----------------------------------------
#          8. 输出最终结果
# ----------------------------------------
# 任务结束后，从聊天环境中获取最终的项目产出路径
final_project_path = chat_chain.chat_env.env_dict.get("directory")
if final_project_path:
    # 打印一个特定格式的字符串到标准输出，方便外部工具（如Web UI）捕获
    print(f"CHATDEV_PROJECT_PATH:{os.path.basename(final_project_path)}")
